package edu.biwu;

import jakarta.servlet.*;

import java.io.IOException;

/**
 * Servlet的生命周期
 *   1.首次访问ServletDemo02,会执行以下操作
 *     a.Tomcat底层会开启线程处理当前请求
 *     b.利用反射技术创建ServletDemo02对象(会调用到ServletDemo02的空参构造方法)
 *     c.利用ServletDemo02对象调用init方法做初始化操作
 *     d.调用service方法处理用户的请求
 *   2.从第二次之后的访问,会执行如下操作
 *     a.从第二次之后的访问,Tomcat依然会启动一个线程去处理当前请求
 *     b.此时不再利用反射技术创建ServletDemo02的对象,也不再调用init方法初始化
 *       只会使用第一次创建的ServletDemo02对象调用service方法
 *   3.当tomcat被关闭的时候,tomcat会调用destroy()方法来销毁ServletDemo02
 *   注意:
 *     1.每次请求都会使用同一个Servlet对象
 *     2.每次请求Servlet,Tomcat都会启动一个线程
 *     3.Tomcat使用多线程处理用户请求,而这些线程使用的都是同一个Servlet对象
 *       有可能产生多线程操作共享数据的安全性问题,不推荐在Servlet中使用成员变量
 */

public class ServletDemo02 implements Servlet {

    public ServletDemo02() {
        System.out.println("ServletDemo02的构造方法被调用..." + this);
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("ServletDemo02被初始化..." + this);
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Service方法被调用..." + this);
    }

    @Override
    public String getServletInfo() {
        return "";
    }

    @Override
    public void destroy() {
        System.out.println("destroy方法被调用..." + this);
    }
}
